package com.sevilla28.app;

import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import android.content.res.Resources;

import com.sevilla28.modelado.Cancion;
import com.sevilla28.modelado.Habilidad;
import com.sevilla28.modelado.Instrumentos;
import com.sevilla28.modelado.Miembro;
import com.sevilla28.modelado.TiempoLiturgico;
import com.sevilla28.modelado.TipoCancion;



public class XMLParser {
	
	/**
	 * Metodo que parsea el XML con las canciones y su informacion para agregarlas e un HashMap que hace de cantoral
	 * @param resources
	 * @return El cantoral
	 * @throws SAXException
	 * @throws IOException
	 * @throws ParserConfigurationException
	 */
	public HashMap<String, Cancion> parse(Resources resources) throws SAXException, IOException, ParserConfigurationException {
		//Creamos hashmap e instancias necesarias para parseo
		HashMap<String, Cancion> cantoral = new HashMap<String, Cancion>();
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
		InputStream is = resources.getAssets().open("xml/canciones.xml");
		//Parseamos y buscamos las canciones para meterlas en una lista de nodos
		Document dom = db.parse(is);
		NodeList nlist = dom.getElementsByTagName("cancion");
		int i = 0;
         if( nlist != null){
        	 while(i<nlist.getLength()){
        		 //Mientras haya mas canciones tratamos cada una
        		 Node cancion = nlist.item(i);
        		 NodeList datosCancion = cancion.getChildNodes();
        		 int x = 0;
    			 Cancion c = new Cancion();
        		 while(x<datosCancion.getLength()) {
        			 //Tratamos el dato obtenido dependiendo de cual sea
        			 Node dato = datosCancion.item(x);
        			 if(dato.getNodeType() != Node.TEXT_NODE){
        				 if(dato.getNodeName().equals("idCancion")) {
        					 c.setIdCancion(dato.getFirstChild().getNodeValue());
        				 } else if(dato.getNodeName().equals("nombre")) {
        					 c.setNombre(dato.getFirstChild().getNodeValue());
        				 } else if(dato.getNodeName().equals("letra")) {
        					 c.setLetra(dato.getFirstChild().getNodeValue());
        				 } else if(dato.getNodeName().equals("tipos"))  {
        					 int w = 0;
        					 while (w<dato.getChildNodes().getLength()) {
        						 //Agregamos los distintos tipos de cancion
        						 if(dato.getChildNodes().item(w).getNodeType() != Node.TEXT_NODE)
        						 c.addTipo(TipoCancion.valueOf(dato.getChildNodes().item(w).getFirstChild().getNodeValue()));
        						 w++;
        					 }
        				 } else if(dato.getNodeName().equals("tiempoLiturgico")){
        					 c.setTiempoLiturgico(TiempoLiturgico.valueOf(dato.getFirstChild().getNodeValue()));
        				 } else if(dato.getNodeName().equals("ficheroAudio")){
        					 c.setRutaCancion(dato.getFirstChild().getNodeValue());
        				 } else if(dato.getNodeName().equals("youtubeID")){
        					 c.setYoutubeID(dato.getFirstChild().getNodeValue());
        				 } else {
        					 //No hacemos nada
        				 }
        			 }
        			 x++;
        		 }
        		 //Metemos la cancion en el map
        		 cantoral.put(c.getIdCancion(), c);
            	 i++;
        	 }
         }
		return cantoral;
	}
	
	public HashMap<String, Miembro> parseMiembros(Resources res) throws ParserConfigurationException, IOException, SAXException {
		//Creamos hashmap e instancias necesarias para parseo
		HashMap<String, Miembro> coro = new HashMap<String, Miembro>();
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
		InputStream is = res.getAssets().open("xml/miembros.xml");
		//Parseamos y buscamos los miembros para meterlos en una lista de nodos
		Document dom = db.parse(is);
		NodeList nlist = dom.getElementsByTagName("miembro");
		int i = 0;
         if( nlist != null){
        	 while(i<nlist.getLength()){
        		 //Mientras haya mas miembros tratamos cada uno
        		 Node miembro = nlist.item(i);
        		 NodeList datosMiembro = miembro.getChildNodes();
        		 int x = 0;
    			 Miembro m = new Miembro();
        		 while(x<datosMiembro.getLength()) {
        			 //Tratamos el dato obtenido dependiendo de cual sea
        			 Node dato = datosMiembro.item(x);
        			 if(dato.getNodeType() != Node.TEXT_NODE){
        				 if(dato.getNodeName().equals("idMiembro")) {
        					 m.setIdMiembro(dato.getFirstChild().getNodeValue());
        				 } else if(dato.getNodeName().equals("nombre")) {
        					 m.setNombre(dato.getFirstChild().getNodeValue());
        				 } else if(dato.getNodeName().equals("descripcion")) {
        					 m.setDescripcion(dato.getFirstChild().getNodeValue());
        				 } else if(dato.getNodeName().equals("habilidades"))  {
        					 //TODO
        					 int w = 0;
        					 while (w<dato.getChildNodes().getLength()) {
        						 //Agregamos los distintos tipos de cancion
        						 if(dato.getChildNodes().item(w).getNodeType() != Node.TEXT_NODE){
        							 Node habilidad = dato.getChildNodes().item(w);
        							 int a = 0;
        							 Habilidad hab = new Habilidad();
        							 while(a<habilidad.getChildNodes().getLength()) {
        								 Node instrumentoCapacidad = habilidad.getChildNodes().item(a);
        								 if(instrumentoCapacidad.getNodeType() != Node.TEXT_NODE) {
        									 if(instrumentoCapacidad.getNodeName().equals("instrumento")) {
        										 hab.setInstrumento(Instrumentos.valueOf(instrumentoCapacidad.getFirstChild().getNodeValue()));
        									 } else if(instrumentoCapacidad.getNodeName().equals("capacidad")) {
        										 hab.setHabilidad(Integer.parseInt(instrumentoCapacidad.getFirstChild().getNodeValue()));
        									 } else {
        										 //Nothing
        									 }
        								 }
        								 if(a == habilidad.getChildNodes().getLength()-1)
        									 m.addHabilidad(hab);
        								 a++;
        							 }
        						 }
        						 w++;
        					 }
        				 } else if(dato.getNodeName().equals("rutaFoto")){
        					 m.setRutaFoto(dato.getFirstChild().getNodeValue());
        				 } else {
        					 //No hacemos nada
        				 }
        			 }
        			 x++;
        		 }
        		 //Metemos el miembro en el map
        		 coro.put(m.getIdMiembro(), m);
            	 i++;
        	 }
         }
		return coro;
	}


}
